package cn.xeblog.plugin.tools.read.entity;

import cn.hutool.core.collection.CollUtil;
import cn.xeblog.plugin.cache.DataCache;
import cn.xeblog.plugin.tools.read.api.LegadoApi;
import cn.xeblog.plugin.tools.read.util.CharsetConverter;
import com.intellij.util.xmlb.annotations.OptionTag;
import com.intellij.util.xmlb.annotations.Transient;

import java.nio.charset.Charset;
import java.util.List;
import java.util.Objects;

import lombok.Getter;
import lombok.Setter;

/**
 * 书籍
 *
 * @author LYF
 * @date 2022-07-18
 */
@Setter
public class Book {

    /**
     * 名称
     */
    @Getter
    private String name;
    /**
     * 作者
     */
    @Getter
    private String author;
    /**
     * 书籍路径
     */
    @Getter
    private String url;
    /**
     * 章节索引
     */
    @Getter
    private Integer chapterIndex;
    /**
     * 章节阅读的进度位置
     */
    @Getter
    private Integer chapterPos;
    /**
     * 是否困难模式，（false,简单，true,困难）
     */
    @Getter
    private Boolean hard = false;
    /**
     * 章节列表
     */
    private List<Chapter> chapters;
    /**
     * 书籍类型
     */
    @Getter
    private BookType type;
    /**
     * 字符集
     */
    @Getter
    @OptionTag(converter = CharsetConverter.class)
    private Charset charset;
    /**
     * 章节模式（即章节解析正则表达式）
     */
    @Getter
    private String chapterPattern;

    /**
     * 获取章节列表
     *
     * @return 章节列表
     */
    @Transient
    public List<Chapter> getChapters() {
        return chapters;
    }

    /**
     * 获取当前章节
     *
     * @return 章节对象
     */
    public Chapter getCurrentChapter() {
        // 章节内容不为空并且章节章数大于0并且没有超过章节范围，获取章节信息
        if (CollUtil.isNotEmpty(chapters) && chapterIndex >= 0 && chapterIndex < chapters.size()) {
            return chapters.get(chapterIndex);
        }
        return null;
    }

    /**
     * 生成章节
     *
     * @return 章节列表
     * @throws Exception 生成失败，抛出
     */
    public List<Chapter> generateChapter() throws Exception {
        // 本地书籍
        if (type == BookType.LOCAL) {
            chapters = Chapter.generateChapter(url, charset, chapterPattern);
        } else {
            // 通过api获取章节信息
            LegadoApi api = new LegadoApi(DataCache.readConfig.getLegadoHost());
            chapters = api.getChapterList(url);
        }
        return chapters;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        Book book = (Book) o;
        return Objects.equals(url, book.url);
    }

    @Override
    public int hashCode() {
        return Objects.hash(url);
    }
}
